/** 双字节字符(包括汉字在内，即占两个英文字符位置的字符) */
export const double_byte_RegEx = /[^\x00-\xff]/; // eslint-disable-line no-control-regex

/** 中文字符 */
export const chinese_RegEx = /[\u4e00-\u9fa5]/;

/** 验证密码 不能为纯数字字母或特殊符号的6到18位字符 */
export const password_RegEx = /^(?![0-9]+$)(?![a-z]+$)(?![A-Z]+$)(?!([^(0-9a-zA-Z)])+$)^.{6,18}$/;

/** 验证电话号 */
export const tel_RegEx = /^[1][0-9]{10}$/;

/** 邮箱 */
export const email_RegEx = /^([\w_-]+)@([\w-]+[.]?)*[\w]+\.[a-zA-Z]{2,10}$/;

/** 网址不带参数 */
export const url_RegEx = /^(https?:\/\/)([a-zA-Z0-9-]+\.)+[a-zA-Z]{2,}(\/[^\s]*)?$/;
/** 网址带参数 */
export const url_RegEx2 = /^(https?:\/\/)([a-zA-Z0-9-]+\.)+[a-zA-Z]{2,}(\/[^\s?#]*)?(\?[^?\s#]*)?(#[^\s]*)?$/;

/** 身份证 */
export const IDcard_RegEx = /^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X|x)$/;

/** 视频 */
export const video_RegEx = /\.(mp4|mpg|mpeg|dat|asf|avi|rm|rmvb|mov|wmv|flv|mkv|m3u8)/i;

/**
 * 验证密码合法性
 */
export function verifyPassword(str: string): boolean {
  return Boolean(password_RegEx.test(str));
}

/**
 * 验证电话号
 */
export function verifyTel(str: string): boolean {
  return Boolean(tel_RegEx.test(str));
}

/**
 * 验证邮箱
 */
export function verifyEmail(str: string): boolean {
  return Boolean(email_RegEx.test(str));
}

/**
 * 验证身份证
 */
export function verifyIDcard(str: string): boolean {
  if (!IDcard_RegEx.test(str)) {
    return false;
  }
  try {
    // 出生年月日校验
    const year = str.slice(6, 10); // 身份证年
    const month = str.slice(10, 12); // 身份证月
    const date = str.slice(12, 14); // 身份证日
    const d = new Date(`${year}/${month}/${date}`);
    const dY = Number(d.getFullYear());
    const dM = Number(d.getMonth()) + 1;
    const dD = Number(d.getDate());
    if (Number(year) === dY && Number(month) === dM && Number(date) === dD) {
      // 限制起始年份为1850且不能超过今天
      if (d.getTime() <= new Date().getTime() && dY >= 1850) {
        return true;
      } else {
        return false;
      }
    } else {
      return false;
    }
  } catch (e) {
    return false;
  }
}

/**
 * 验证网址
 * @param str - 网址
 * @param isParam - 可以携带参数 默认为 true
 */
export function verifyUrl(str: string, isParam = true): boolean {
  return Boolean(isParam ? url_RegEx2.test(str) : url_RegEx.test(str));
}

/**
 * 是否为纯对象 不包含 Array,undefined function 等等
 */
export function isObject(obj: unknown): obj is Record<number | string | symbol, unknown> {
  return Object.prototype.toString.call(obj) === '[object Object]';
}

/**
 * 是否为 nvue 页面
 */
export function isNvuePage() {
  let _isNvue = false;
  // #ifdef   APP-PLUS-NVUE
  _isNvue = true;
  // #endif
  return _isNvue;
}

/**
 * 验证 url 是否为视频
 */
export function verifyVideoUrl(str: string): boolean {
  return Boolean(video_RegEx.test(str));
}
